package 炫彩元素类

import (
	xc "gitee.com/go_888/xcgui/xcgui/xc"
	xcc "gitee.com/go_888/xcgui/xcgui/xcc"
)

// 日期时间.
type X结构_日期 struct {
	X结构_基础元素
}

// 日期_创建, 创建日期时间元素.
//
// x: x坐标.
//
// y: y坐标.
//
// cx: 宽度.
//
// cy: 高度.
//
// hParent: 父为窗口句柄或元素句柄.
func X创建日期(x坐标, y坐标, 宽度, 高度 int32, 父窗口句柄 int) *X结构_日期 {
	p := &X结构_日期{}
	p.X设置句柄(xc.X日期_创建(x坐标, y坐标, 宽度, 高度, 父窗口句柄))
	return p
}

// 从句柄创建对象.
func X创建日期并按句柄(句柄 int) *X结构_日期 {
	p := &X结构_日期{}
	p.X设置句柄(句柄)
	return p
}

// 从name创建对象, 失败返回nil.
func X创建日期并按名称(名称 string) *X结构_日期 {
	handle := xc.X取对象并按名称(名称)
	if handle > 0 {
		p := &X结构_日期{}
		p.X设置句柄(handle)
		return p
	}
	return nil
}

// 从UID创建对象, 失败返回nil.
func X创建日期并按UID(UID int32) *X结构_日期 {
	handle := xc.X取对象并按UID(UID)
	if handle > 0 {
		p := &X结构_日期{}
		p.X设置句柄(handle)
		return p
	}
	return nil
}

// 从UID名称创建对象, 失败返回nil.
func X创建日期并按UID名称(名称 string) *X结构_日期 {
	handle := xc.X取对象并按UID名称(名称)
	if handle > 0 {
		p := &X结构_日期{}
		p.X设置句柄(handle)
		return p
	}
	return nil
}

// 日期_置样式, 设置样式.
//
// nStyle: 样式: 0为日期元素, 1为时间元素.
func (d *X结构_日期) X设置样式(样式 int32) *X结构_日期 {
	xc.X日期_设置样式(d.X句柄, 样式)
	return d
}

// 日期_取样式, 返回元素样式.
func (d *X结构_日期) X取样式() int32 {
	return xc.X日期_取样式(d.X句柄)
}

// 日期_启用分割栏为斜线, 切换分割栏为: 斜线或横线.
//
// bSlash: TRUE: 斜线, FALSE: 横线.
func (d *X结构_日期) X设置分割栏为斜线(斜线 bool) *X结构_日期 {
	xc.X日期_启用分割栏为斜线(d.X句柄, 斜线)
	return d
}

// 日期_取内部按钮, 获取内部按钮元素.
//
// nType: 按钮类型.
func (d *X结构_日期) X取内部按钮(按钮类型 int32) int {
	return xc.X日期_取内部按钮(d.X句柄, 按钮类型)
}

// 日期_取选择日期背景颜色, 获取被选择文字的背景颜色.
func (d *X结构_日期) X取选择日期背景颜色() int {
	return xc.X日期_取选择日期背景颜色(d.X句柄)
}

// 日期_置选择日期背景颜色, 设置被选择文字的背景颜色.
//
// crSelectBk: 文字被选中背景色, xc.RGBA 颜色.
func (d *X结构_日期) X设置选择日期背景颜色(背景色 int) *X结构_日期 {
	xc.X日期_设置选择日期背景颜色(d.X句柄, 背景色)
	return d
}

// 日期_取当前日期.
//
// pnYear: 年.[OUT].
//
// pnMonth: 月.[OUT].
//
// pnDay: 日.[OUT].
func (d *X结构_日期) X取当前日期(年指针 *int32, 月指针 *int32, 日指针 *int32) *X结构_日期 {
	xc.X日期_取当前日期(d.X句柄, 年指针, 月指针, 日指针)
	return d
}

// 日期_取当前日期Ex.
func (d *X结构_日期) GetDateEx() (year, month, day int32) {
	var pnYear, pnMonth, pnDay int32
	xc.X日期_取当前日期(d.X句柄, &pnYear, &pnMonth, &pnDay)
	return pnYear, pnMonth, pnDay
}

// 日期_置当前日期.
//
// nYear: 年.
//
// nMonth: 月.
//
// nDay: 日.
func (d *X结构_日期) X设置当前日期(年 int32, 月 int32, 日 int32) *X结构_日期 {
	xc.X日期_设置当前日期(d.X句柄, 年, 月, 日)
	return d
}

// 日期_取当前时间.
//
// pnHour: 时.[OUT].
//
// pnMinute: 分.[OUT].
//
// pnSecond: 秒.[OUT].
func (d *X结构_日期) X取当前时间(时指针 *int32, 分指针 *int32, 秒指针 *int32) *X结构_日期 {
	xc.X日期_取当前时间(d.X句柄, 时指针, 分指针, 秒指针)
	return d
}

// 日期_取当前时间Ex.
func (d *X结构_日期) GetTimeEx() (hour int32, minute int32, second int32) {
	var pnHour, pnMinute, pnSecond int32
	xc.X日期_取当前时间(d.X句柄, &pnHour, &pnMinute, &pnSecond)
	return pnHour, pnMinute, pnSecond
}

// 日期_设置当前时间, 设置当前时分秒.
//
// nHour: 时.
//
// nMinute: 分.
//
// nSecond: 秒.
func (d *X结构_日期) X设置当前时间(时 int32, 分 int32, 秒 int32) *X结构_日期 {
	xc.X日期_社区当前时间(d.X句柄, 时, 分, 秒)
	return d
}

// 日期_弹出, 弹出月历卡片.
func (d *X结构_日期) X弹出月历卡片() *X结构_日期 {
	xc.X日期_弹出(d.X句柄)
	return d
}

// ------------------------- 事件 ------------------------- //

type X事件_日期_内容改变 func(pbHandled *bool) int                                                     // 日期时间元素,内容改变事件.
type X事件_日期_内容改变1 func(hEle int, pbHandled *bool) int                                          // 日期时间元素,内容改变事件.
type X事件_日期_弹出月历 func(hMonthCalWnd int, hMonthCal int, pbHandled *bool) int            // 日期时间元素,弹出月历卡片事件.
type X事件_日期_弹出月历1 func(hEle int, hMonthCalWnd int, hMonthCal int, pbHandled *bool) int // 日期时间元素,弹出月历卡片事件.
type X事件_日期_收缩月历 func(hMonthCalWnd int, hMonthCal int, pbHandled *bool) int             // 日期时间元素,弹出的月历卡片退出事件.
type X事件_日期_收缩月历1 func(hEle int, hMonthCalWnd int, hMonthCal int, pbHandled *bool) int  // 日期时间元素,弹出的月历卡片退出事件.

// 日期时间元素,内容改变事件.
func (d *X结构_日期) X事件_内容改变(回调函数 X事件_日期_内容改变) bool {
	return xc.X元素_注册事件C(d.X句柄, xcc.X元素事件_月历_内容改变, 回调函数)
}

// 日期时间元素,内容改变事件.
func (d *X结构_日期) X事件_内容改变1(回调函数 X事件_日期_内容改变1) bool {
	return xc.X元素_注册事件C1(d.X句柄, xcc.X元素事件_月历_内容改变, 回调函数)
}

// 日期时间元素,弹出月历卡片事件.
func (d *X结构_日期) X事件_弹出月历卡片(回调函数 X事件_日期_弹出月历) bool {
	return xc.X元素_注册事件C(d.X句柄, xcc.X元素事件_月历_卡片弹出, 回调函数)
}

// 日期时间元素,弹出月历卡片事件.
func (d *X结构_日期) X事件_弹出月历卡片1(回调函数 X事件_日期_弹出月历1) bool {
	return xc.X元素_注册事件C1(d.X句柄, xcc.X元素事件_月历_卡片弹出, 回调函数)
}

// 日期时间元素,弹出的月历卡片退出事件.
func (d *X结构_日期) X事件_月历卡片退出(回调函数 X事件_日期_收缩月历) bool {
	return xc.X元素_注册事件C(d.X句柄, xcc.X元素事件_月历_卡片退出, 回调函数)
}

// 日期时间元素,弹出的月历卡片退出事件.
func (d *X结构_日期) X事件_月历卡片退出1(回调函数 X事件_日期_收缩月历1) bool {
	return xc.X元素_注册事件C1(d.X句柄, xcc.X元素事件_月历_卡片退出, 回调函数)
}

// ------------------------- AddEvent ------------------------- //

// AddEvent_DateTime_Change 添加日期时间元素内容改变事件.
//
// pFun: 回调函数.
//
// allowAddingMultiple: 允许添加多个回调函数.
func (d *X结构_日期) AddEvent_DateTime_Change(pFun X事件_日期_内容改变1, allowAddingMultiple ...bool) int {
	return EventHandler.AddCallBack(d.X句柄, xcc.X元素事件_月历_内容改变, onXE_DATETIME_CHANGE, pFun, allowAddingMultiple...)
}

// onXE_DATETIME_CHANGE 日期时间元素内容改变事件.
func onXE_DATETIME_CHANGE(hEle int, pbHandled *bool) int {
	cbs := EventHandler.GetCallBacks(hEle, xcc.X元素事件_月历_内容改变)
	var ret int
	for i := len(cbs) - 1; i >= 0; i-- {
		if cbs[i] != nil {
			ret = cbs[i].(X事件_日期_内容改变1)(hEle, pbHandled)
			if *pbHandled {
				break
			}
		}
	}
	return ret
}

// AddEvent_DateTime_Popup_MonthCal 添加日期时间元素弹出月历卡片事件.
//
// pFun: 回调函数.
//
// allowAddingMultiple: 允许添加多个回调函数.
func (d *X结构_日期) AddEvent_DateTime_Popup_MonthCal(pFun X事件_日期_弹出月历1, allowAddingMultiple ...bool) int {
	return EventHandler.AddCallBack(d.X句柄, xcc.X元素事件_月历_卡片弹出, onXE_DATETIME_POPUP_MONTHCAL, pFun, allowAddingMultiple...)
}

// onXE_DATETIME_POPUP_MONTHCAL 日期时间元素弹出月历卡片事件.
func onXE_DATETIME_POPUP_MONTHCAL(hEle int, hMonthCalWnd int, hMonthCal int, pbHandled *bool) int {
	cbs := EventHandler.GetCallBacks(hEle, xcc.X元素事件_月历_卡片弹出)
	var ret int
	for i := len(cbs) - 1; i >= 0; i-- {
		if cbs[i] != nil {
			ret = cbs[i].(X事件_日期_弹出月历1)(hEle, hMonthCalWnd, hMonthCal, pbHandled)
			if *pbHandled {
				break
			}
		}
	}
	return ret
}

// AddEvent_DateTime_Exit_MonthCal 添加日期时间元素弹出的月历卡片退出事件.
//
// pFun: 回调函数.
//
// allowAddingMultiple: 允许添加多个回调函数.
func (d *X结构_日期) AddEvent_DateTime_Exit_MonthCal(pFun X事件_日期_收缩月历1, allowAddingMultiple ...bool) int {
	return EventHandler.AddCallBack(d.X句柄, xcc.X元素事件_月历_卡片退出, onXE_DATETIME_EXIT_MONTHCAL, pFun, allowAddingMultiple...)
}

// onXE_DATETIME_EXIT_MONTHCAL 日期时间元素弹出的月历卡片退出事件.
func onXE_DATETIME_EXIT_MONTHCAL(hEle int, hMonthCalWnd int, hMonthCal int, pbHandled *bool) int {
	cbs := EventHandler.GetCallBacks(hEle, xcc.X元素事件_月历_卡片退出)
	var ret int
	for i := len(cbs) - 1; i >= 0; i-- {
		if cbs[i] != nil {
			ret = cbs[i].(X事件_日期_收缩月历1)(hEle, hMonthCalWnd, hMonthCal, pbHandled)
			if *pbHandled {
				break
			}
		}
	}
	return ret
}
